package cl.gob.minvu.catastro.managedBean;

import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import org.jboss.logging.Logger;

import cl.gob.minvu.catastro.ejb.FichaEJBRemote;
import cl.gob.minvu.catastro.model.Comuna;
import cl.gob.minvu.catastro.model.Direccion;
import cl.gob.minvu.catastro.model.Encuestado;
import cl.gob.minvu.catastro.model.EstadoFicha;
import cl.gob.minvu.catastro.model.Ficha;
import cl.gob.minvu.catastro.model.GrupoSecundario;
import cl.gob.minvu.catastro.model.Region;
import cl.gob.minvu.catastro.model.TipoCatastrofe;
import cl.gob.minvu.catastro.util.ManagedBeanUtil;

/**
 * @author psep
 *
 */
@ManagedBean(name="fichaBean")
@SessionScoped
public class FichaBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private static final Logger logger = Logger.getLogger(FichaBean.class);
	
	@EJB
	private FichaEJBRemote fichaEJB;
	
	private List<Ficha> fichas;
	private Ficha ficha;
	private Ficha fichaVO;
	private Ficha fichaSeleccionada;
	private List<SelectItem> estados;
	private String photo;
	private boolean btnPhoto;
	
	@PostConstruct
	public void init() {
		this.fichas = this.fichaEJB.list(null);
		this.clearFrm();
		this.loadComboEstados();
	}
	
	public void clearFrm() {
		this.fichaSeleccionada = null;
		this.photo = "";
		this.ficha = new Ficha();
		this.loadViewObject();
		this.btnPhoto= false;
		this.ficha.setEstadoFicha(new EstadoFicha());
	}
	
	public void loadViewObject() {
		this.fichaVO = new Ficha();
		this.fichaVO.setDireccion(new Direccion());
		this.fichaVO.getDireccion().setComuna(new Comuna());
		this.fichaVO.getDireccion().getComuna().setRegion(new Region());
		this.fichaVO.setTipoCatastrofe(new TipoCatastrofe());
		this.fichaVO.setEncuestado(new Encuestado());
		this.fichaVO.getEncuestado().setGrupoSecundarios(new LinkedList<GrupoSecundario>());
	}
	
	/**
	 * 
	 */
	private void loadComboEstados() {
		List<EstadoFicha> listaEstados = this.fichaEJB.estadoFichas();
		Iterator<EstadoFicha> iter = listaEstados.iterator();
		this.estados = new LinkedList<SelectItem>();
		
		while (iter.hasNext()) {
			EstadoFicha estado = (EstadoFicha) iter.next();
			this.estados.add(new SelectItem(estado.getIdestadoficha(), estado.getGlosa()));
		}
	}
	
	/**
	 * @return
	 */
	public String viewFicha() {
		if (this.fichaSeleccionada != null) {
			this.fichaVO = this.fichaSeleccionada;
			return "vistaFicha?faces-redirect=true";
		} else {
			ManagedBeanUtil.getMessageERROR("Debe seleccionar una ficha para poder visualizar");
			return null;
		}		
	}
	
	/**
	 * Método de acción que actualiza la ficha
	 * validando reglas de negocio.
	 */
	public void updateFicha() {
		if (this.fichaSeleccionada == null) {
			ManagedBeanUtil.getMessageERROR("Debe seleccionar una Ficha a actualizar");
		} else if (this.ficha.getEstadoFicha().getIdestadoficha() == 0) {
			ManagedBeanUtil.getMessageWARN("Debe seleccionar un estado");
		} else if (!this.fichaEJB.update(this.ficha)) {
			ManagedBeanUtil.getMessageERROR("Se ha producido un error al actualizar la ficha, intente más tarde");
		} else {
			ManagedBeanUtil.getMessageINFO("La Ficha ha sido actualizada");
		}
		
		this.init();
	}
	
	public void loadForUpdate() {
		this.ficha = this.fichaSeleccionada;
	}

	public List<Ficha> getFichas() {
		return fichas;
	}

	public void setFichas(List<Ficha> fichas) {
		this.fichas = fichas;
	}

	public Ficha getFichaSeleccionada() {
		return fichaSeleccionada;
	}

	public void setFichaSeleccionada(Ficha fichaSeleccionada) {
		this.fichaSeleccionada = fichaSeleccionada;
	}

	public List<SelectItem> getEstados() {
		return estados;
	}

	public void setEstados(List<SelectItem> estados) {
		this.estados = estados;
	}
	
	public Ficha getFicha() {
		return ficha;
	}

	public void setFicha(Ficha ficha) {
		this.ficha = ficha;
	}

	public Ficha getFichaVO() {
		return fichaVO;
	}

	public void setFichaVO(Ficha fichaVO) {
		this.fichaVO = fichaVO;
	}

	/**
	 * @return
	 */
	public String getPhoto() {
		if (this.fichaVO.getFoto() != null) {
			try {
				String foto = new String(this.fichaVO.getFoto(), "UTF-8");
				
				if (foto != null && !foto.equals("")) {
					this.photo = "data:image/jpeg;base64," + foto;
				}
			} catch (UnsupportedEncodingException e) {
				logger.error(e, e);
			}
		}
		
		return photo;
	}

	public void setPhoto(String photo) {
		this.photo = photo;
	}

	public boolean isBtnPhoto() {
		if (!this.getPhoto().equals("")) {
			this.btnPhoto = false;
		} else {
			this.btnPhoto = true;
		}
		
		return btnPhoto;
	}

	public void setBtnPhoto(boolean btnPhoto) {
		this.btnPhoto = btnPhoto;
	}
}
